home *** CD-ROM | disk | FTP | other *** search
/ Info-Mac 1992 August / info-mac-1992.iso / Applications (app) / STvi / stevie 3.10 / minix.c < prev    next >
Text File  |  1991-01-03  |  3KB  |  251 lines

  1. /* $Header: /nw/tony/src/stevie/src/RCS/minix.c,v 1.5 89/07/11 21:24:18 tony Exp $
  2.  *
  3.  * System-dependent routines for Minix-ST
  4.  */
  5.  
  6. #include "stevie.h"
  7. #include <sgtty.h>
  8. #include <signal.h>
  9.  
  10. /*
  11.  * inchar() - get a character from the keyboard
  12.  */
  13. int
  14. inchar()
  15. {
  16.     char    c;
  17.  
  18.     flushbuf();        /* flush any pending output */
  19.  
  20.     while (read(0, &c, 1) != 1)
  21.         ;
  22.  
  23.     got_int = FALSE;
  24.     return c;
  25. }
  26.  
  27. #define    BSIZE    2048
  28. static    char    outbuf[BSIZE];
  29. static    int    bpos = 0;
  30.  
  31. void
  32. flushbuf()
  33. {
  34.     if (bpos != 0)
  35.         write(1, outbuf, bpos);
  36.     bpos = 0;
  37. }
  38.  
  39. /*
  40.  * Macro to output a character. Used within this file for speed.
  41.  */
  42. #define    outone(c)    outbuf[bpos++] = c; if (bpos >= BSIZE) flushbuf()
  43.  
  44. /*
  45.  * Function version for use outside this file.
  46.  */
  47. void
  48. outchar(c)
  49. register char    c;
  50. {
  51.     outbuf[bpos++] = c;
  52.     if (bpos >= BSIZE)
  53.         flushbuf();
  54. }
  55.  
  56. void
  57. outstr(s)
  58. register char    *s;
  59. {
  60.     while (*s) {
  61.         outone(*s++);
  62.     }
  63. }
  64.  
  65. void
  66. beep()
  67. {
  68.     outone('\007');
  69. }
  70.  
  71. /*
  72.  * remove(file) - remove a file
  73.  */
  74. void
  75. remove(file)
  76. char *file;
  77. {
  78.     unlink(file);
  79. }
  80.  
  81. /*
  82.  * rename(of, nf) - rename existing file 'of' to 'nf'
  83.  */
  84. void
  85. rename(of, nf)
  86. char    *of, *nf;
  87. {
  88.     unlink(nf);
  89.     link(of, nf);
  90.     unlink(of);
  91. }
  92.  
  93. void
  94. delay()
  95. {
  96.     /* not implemented */
  97. }
  98.  
  99. static    struct    sgttyb    ostate;
  100.  
  101. /*
  102.  * Go into cbreak mode
  103.  */
  104. void
  105. set_tty()
  106. {
  107.     struct    sgttyb    nstate;
  108.  
  109.      ioctl(0, TIOCGETP, &ostate);
  110.      nstate = ostate;
  111.      nstate.sg_flags &= ~(XTABS|ECHO);
  112.      nstate.sg_flags |= CBREAK;
  113.      ioctl(0, TIOCSETP, &nstate);
  114. }
  115.  
  116. /*
  117.  * Restore original terminal modes
  118.  */
  119. void
  120. reset_tty()
  121. {
  122.     ioctl(0, TIOCSETP, &ostate);
  123. }
  124.  
  125. void
  126. sig()
  127. {
  128.     signal(SIGINT, sig);
  129.     signal(SIGQUIT, sig);
  130.  
  131.     got_int = TRUE;
  132. }
  133.  
  134. void
  135. windinit()
  136. {
  137. #ifdef    TERMCAP
  138.     if (t_init() != 1) {
  139.         fprintf(stderr, "unknown terminal type\n");
  140.         exit(1);
  141.     }
  142. #else
  143.     Columns = 80;
  144.     P(P_LI) = Rows = 25;
  145. #endif
  146.     /*
  147.      * The code here makes sure that there isn't a window during which
  148.      * we could get interrupted and exit with the tty in a weird state.
  149.      */
  150.     signal(SIGINT, sig);
  151.     signal(SIGQUIT, sig);
  152.  
  153.     set_tty();
  154.  
  155.     if (got_int)
  156.         windexit(0);
  157. }
  158.  
  159. void
  160. windexit(r)
  161. int r;
  162. {
  163.     reset_tty();
  164.     exit(r);
  165. }
  166.  
  167. void
  168. windgoto(r, c)
  169. register int    r, c;
  170. {
  171. #ifdef    TERMCAP
  172.     char    *tgoto();
  173. #else
  174.     r += 1;
  175.     c += 1;
  176. #endif
  177.  
  178.     /*
  179.      * Check for overflow once, to save time.
  180.      */
  181.     if (bpos + 8 >= BSIZE)
  182.         flushbuf();
  183.  
  184. #ifdef    TERMCAP
  185.     outstr(tgoto(T_CM, c, r));
  186. #else
  187.     outbuf[bpos++] = '\033';
  188.     outbuf[bpos++] = '[';
  189.     if (r >= 10)
  190.         outbuf[bpos++] = r/10 + '0';
  191.     outbuf[bpos++] = r%10 + '0';
  192.     outbuf[bpos++] = ';';
  193.     if (c >= 10)
  194.         outbuf[bpos++] = c/10 + '0';
  195.     outbuf[bpos++] = c%10 + '0';
  196.     outbuf[bpos++] = 'H';
  197. #endif
  198. }
  199.  
  200. FILE *
  201. fopenb(fname, mode)
  202. char    *fname;
  203. char    *mode;
  204. {
  205.     return fopen(fname, mode);
  206. }
  207.  
  208. char *
  209. strchr(s, c)
  210. char    *s;
  211. char    c;
  212. {
  213.     char *index();
  214.  
  215.     return index(s, c);
  216. }
  217.  
  218. char *
  219. fixname(s)
  220. char    *s;
  221. {
  222.     return s;
  223. }
  224.  
  225. /*
  226.  * doshell() - run a command or an interactive shell
  227.  */
  228. void
  229. doshell(cmd)
  230. char    *cmd;
  231. {
  232.     char    *cp, *getenv();
  233.     char    cline[128];
  234.  
  235.     outstr("\r\n");
  236.     flushbuf();
  237.  
  238.     if (cmd == NULL) {
  239.         if ((cmd = getenv("SHELL")) == NULL)
  240.             cmd = "/bin/sh";
  241.         sprintf(cline, "%s -i", cmd);
  242.         cmd = cline;
  243.     }
  244.  
  245.     reset_tty();
  246.     system(cmd);
  247.     set_tty();
  248.  
  249.     wait_return();
  250. }
  251.